import {Lang, Optional} from 'c3-util'
export  class SoaResponseInfo {
    private resultCode:number=-1
    private resultMessage:string='uninitial'
    private orialData:any
	private serviceName:string
	constructor(serviceName:string){
		this.serviceName=serviceName
	}
	/**
	 * {
	 * 'tableName':{'row的内容,有可能是数组'}
	 * }
	 */
	private tablesMap=new Map<string,any>()
	/**
	 * [{"row":["access_token","expire_time"],"table_name":"content"}]
	 */
	private _tableMetas:Array<any>=new Array()

	/**
	 * 创建soaResponse对象 
	 * @param serviceName 服务名
	 * @param resultCode 结果
	 * @param resultMessage 结果说明
	 * @returns 
	 */
	public static createResponse(serviceName:string,resultCode:number,resultMessage:string):SoaResponseInfo{
		const tempSoaResp=new SoaResponseInfo(serviceName)
		tempSoaResp.setResultCode(resultCode)
		tempSoaResp.setResultMessage(resultMessage)
		return tempSoaResp
	}


	/**
	 * 判断服务是否成功 
	 * @returns 服务是否成功
	 */
    public success():boolean{
		return this.resultCode==0;
	}
	public getResultCode():number{
		return this.resultCode;
	}
	public setResultCode(resultCode:number):void {
		this.resultCode = resultCode;
	}
	public getResultMessage():string {
		return this.resultMessage;
	}
	public setResultMessage(resultMessage:string):void {
		this.resultMessage = resultMessage;
	}

	public getServiceName():string{
		return this.serviceName
	}
	/**
	 * 根据序号获取表格名称
	 * @param index _tables_meta的数组序号
	 * @returns 表格名称
	 */
	private getTableName(index:number):Optional<{tableName:string,multi:boolean}> {
		if(this._tableMetas.length>=(index+1)){
			const tableMeta=this._tableMetas[index]
			return Optional.ofNullable({tableName:tableMeta.table_name,multi:tableMeta.multi})
		}
		return Optional.empty()
	}

	/**
	 * 获取第一个表格列名的内容
	 * @param columnName 第一表格的列名
	 * @returns optional<string> 可能没有值
	 */
	public getFirstTableColumnValue(columnName:string):Optional<string>{
       let optionTableName=this.getTableName(0)
       if(optionTableName.isPresent()){
		   const tableMetaObj=optionTableName.get()
		   const tableObj=this.tablesMap.get(tableMetaObj.tableName)
		   if(tableMetaObj.multi&& tableObj.length>0){//是数组
			return Optional.of(tableObj[0][columnName])
		   } else {
			return Optional.ofNullable(tableObj[columnName])
		   }
       }
	   return Optional.empty()
	}

	/**
	 * 获取第一个表的第一个row,如果多行返回，只返回第一行
	 * @returns 第一表的，第一个row
	 */
	public getFirstTableRowObj():Optional<any> {
       const  optionTableNameMeta=this.getTableName(0)
       if(optionTableNameMeta.isPresent()){
		   const tableMeta=optionTableNameMeta.get()
		   const tableObj=this.tablesMap.get(tableMeta.tableName)
		   if(tableMeta.multi){
			   return Optional.of(tableObj[0])
		   } else {
			   return Optional.of(tableObj)
		   }
	   }
	   return Optional.empty()
	}
	/**
	 * 返回第一个表的多行记录,如果是当行的表返回就只有一个row的数组
	 * @returns 
	 */
	public getFirstTableMultiRowObj():Optional<Array<any>>{
       const  optionTableNameMeta=this.getTableName(0)
       if(optionTableNameMeta.isPresent()){
		   const tableMeta=optionTableNameMeta.get()
		   const tableObj=this.tablesMap.get(tableMeta.tableName)
		   if(tableMeta.multi){
			   return Optional.of(tableObj)
		   } else {
			   return Optional.of([tableObj])
		   }
	   }
	   return Optional.empty()

	}
	/**
	 * 获取多行的row对象，如果单行返回一条数据的数组
	 * @param tableName 表名
	 * @returns 
	 */
	public getTableMultiRowObj(tableName:string):Optional<Array<any>>{
		if(this.tablesMap.has(tableName)){
			const tableMetas=this._tableMetas.filter(tableMeta=> tableMeta.table_name===tableName)
			if(tableMetas.length>0 && tableMetas[0].multi){
			   return Optional.of(this.tablesMap.get(tableName))
			} else {
			  return Optional.of([this.tablesMap.get(tableName)])
			}
		}
		return Optional.empty()

	}
	/**
	 * 获取某个表的row 对象,如果多行只返回第一行的数据
	 * @param tableName 表名
	 * @returns 
	 */
	public getTableRowObj(tableName:string):Optional<any>{
		if(this.tablesMap.has(tableName)){
			const tableMetas=this._tableMetas.filter(tableMeta=> tableMeta.table_name===tableName)
			if(tableMetas.length>0 && tableMetas[0].multi){
			   return Optional.of(this.tablesMap.get(tableName)[0])
			} else {
			  return Optional.of(this.tablesMap.get(tableName))
			}
		}
		return Optional.empty()

	}

	/**
	 * 初始化,处理从axios返回的response.data
	 * @param orialData axios返回的axiosResponse.data数据结构
	 */
	public initResponse(orialData:any):void {
		if(!orialData){
			console.log('orialData is null ')
			return 
		}
		this.orialData=orialData
		this.resultCode=Number(orialData.head.result)
		this.resultMessage=orialData.head.result_desc
		if(!this.success()){
			return 
		}
		//初始化 body内容
		let tablesMetas=this.orialData._tables_meta
		 for (let i = 0; i < tablesMetas.length; i++) {
			 const tableMeta = tablesMetas[i]
			 this._tableMetas.push(tableMeta)
			 const key=tableMeta.table_name
			 this.tablesMap.set(key,this.orialData[key])
		 }


	}

	public getOrialData():any{
		if(this.orialData){
			return this.orialData
		}
		return {
		   head:{
		   	result:this.resultCode,
		   	result_desc:this.resultMessage
		   }
		}
	}

	/**
	 * 生成json字符串
	 * @returns 返回json字符串
	 */
	public toJson():string{
		if(this.orialData){
			return JSON.stringify(this.orialData)
		}
		return JSON.stringify({
			head:{
				result:this.resultCode,
				result_desc:this.resultMessage
			}
		})
	}



}